昨天我們用最簡單的方式說明了,在ASP. NET中怎麼去對資料庫座連接的方式與如何在專案下創建資料表的方式,今天的話要來說個很重要的東西「中介軟體」
ASP. NET Core 要求管線(Pipeline)由要求委派序列組成,並會一個接著一個呼叫。 下圖說明此概念。 執行緒遵循黑色箭號執行
每一個委派皆能在下個委派的前後執行作業。 處理例外狀況的委派必須提前在管線中呼叫,以便其可與管線後續階段中所發生的例外狀況達成一致
中介軟體(Middleware)是一類提供系統軟體和應用軟體之間連接、便於軟體各部件之間的溝通的軟體。在ASP. NET中簡單就是在client 傳到 server時中間會經過很多中介軟體,這些中介軟體通常都會扮演不同的角色,例如驗證(Authentication)或這授權(Authorization)等等的功能
middleware的註冊方式在 .NET 6後都放在Program.cs
裡坐使用,ASP. NET除了有內建的的Middleware之外,我們也可以用Run
、Use
、Map
來自訂Middleware
內建的中介軟體大都以Use開頭的方式註冊
使用時機 | 使用方式 | 資訊 |
---|---|---|
開發人員例外狀況頁面中介軟體 | UseDeveloperExceptionPage | 回報應用程式執行階段錯誤 |
資料錯誤頁面中介軟體 | UseDatabaseErrorPage | 回報資料庫執行階段錯誤 |
例外狀況處理常式中介軟體 | UseExceptionHandler | 會攔截在下列中介軟體中擲回的例外狀況 |
HTTP 靜態傳輸安全性通訊協定 (HSTS) | UseHsts | 會新增 Strict-Transport-Security 標頭 |
HTTPS 重新導向中介軟體 | UseHttpsRedirection | HTTP 要求重新導向到 HTTPS |
靜態檔案中介軟體 | UseStaticFiles | 傳回靜態檔案並縮短進一步的要求處理時間 |
Cookie 原則中介軟體 | UseCookiePolicy | 使應用程式符合歐盟一般資料保護歸調 (GDPR) 法規 |
路由中介軟體 | UseRouting | 路由要求 |
驗證中介軟體 | UseAuthentication | 在安全資源之前先驗證使用者 |
授權中介軟體 | UseAuthorization | 可授權使用者存取安全資源 |
工作階段中介軟體 | UseSession | 建立並維護工作階段狀態 |
端點路由中介軟體 | UseEndpoints / MapRazorPages | 將 Razor Pages 端點新增至要求管線 |
這裡要特別注意Authentication一定要在Authorization之上,比較多人問題出在這
下面就先舉一個簡單的例子
我們先用前幾天創好的Demo檔,或是自己新增 Webapi,在 Program.cs新增下列
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Use(async (context, next) => {
await context.Response.WriteAsync("middleware -use request1 \r\n"); // 在Request時會執行
var condition = true;
if (condition)
{
await next(); // 跑進下一個middleware
}
await context.Response.WriteAsync("middleware -use request1 \r\n"); // 在反轉時會執行
});
app.Use(async (context, next) => {
await context.Response.WriteAsync("middleware -use request2 \r\n");
var condition = true;
if (condition)
{
await next.Invoke();// 跑進下一個middleware(這裡的會會跑進Run的middleware)
}
await context.Response.WriteAsync("middleware -use request2 \r\n");
});
app.Map("/map", applicationBuilder => // 在特路徑時才會跑進這裡的middleware
{
applicationBuilder.Use(async (context, next) =>
{
await context.Response.WriteAsync("middleware - use test in map1 - request in\n");
await next.Invoke();
await context.Response.WriteAsync("middleware - use test in map1 - response out\n");
});
applicationBuilder.Run(async context =>
{
await context.Response.WriteAsync("middleware - run test in map1\n");
});
});
app.Run(async context =>{
await context.Response.WriteAsync("middleware -run endpoint \r\n");
});
app.Run();
下圖應該會在你執行完後跑出這畫面
參考文章:
https://learn.microsoft.com/zh-tw/aspnet/core/fundamentals/middleware/?view=aspnetcore-6.0
https://ithelp.ithome.com.tw/articles/10259251
https://blog.johnwu.cc/article/ironman-day03-asp-net-core-middleware.html
https://medium.com/@WilliamWhetstone/c-%E4%BD%95%E8%AC%82%E5%A7%94%E6%B4%BE-delegate-e7eec68da4e2